const { exec } = require('child_process');
const path = require('path');
const fs = require('fs');
const os = require('os');

// 使用标准安装路径
const LIBRE_OFFICE_PATH = 'C:\\Program Files\\LibreOffice\\program\\soffice.exe';

// 使用命令行方式转换
async function convertFileWithSoffice(inputPath, outputDir, outputFormat) {
  return new Promise((resolve, reject) => {
    // 确保输出目录存在
    if (!fs.existsSync(outputDir)) {
      fs.mkdirSync(outputDir, { recursive: true });
    }

    // 获取输入文件名（不含扩展名）
    const inputFileName = path.basename(inputPath, path.extname(inputPath));
    
    // 构建命令 - 对于PDF转Word，使用不同的参数
    let command;
    if (outputFormat.includes('docx')) {
      command = `"${LIBRE_OFFICE_PATH}" --headless --infilter="writer_pdf_import" --convert-to docx --outdir "${outputDir}" "${inputPath}"`;
    } else {
      command = `"${LIBRE_OFFICE_PATH}" --headless --convert-to ${outputFormat} "${inputPath}" --outdir "${outputDir}"`;
    }
    
    console.log('执行命令:', command);

    exec(command, (error, stdout, stderr) => {
      if (error) {
        console.error('转换失败:', error);
        reject(error);
        return;
      }
      if (stderr) {
        console.warn('转换警告:', stderr);
      }
      console.log('命令输出:', stdout);

      // 等待文件生成（有时可能需要一点时间）
      setTimeout(() => {
        // 检查输出文件
        const expectedExt = outputFormat.split(':')[0];
        const expectedFileName = `${inputFileName}.${expectedExt}`;
        const outputPath = path.join(outputDir, expectedFileName);

        console.log('检查输出文件:', outputPath);
        
        if (fs.existsSync(outputPath)) {
          resolve(outputPath);
        } else {
          // 如果找不到预期的文件名，尝试查找任何匹配的文件
          const files = fs.readdirSync(outputDir);
          const convertedFile = files.find(file => 
            file.toLowerCase().endsWith(`.${expectedExt.toLowerCase()}`) &&
            fs.statSync(path.join(outputDir, file)).ctime > Date.now() - 10000 // 最近10秒内创建的文件
          );

          if (convertedFile) {
            resolve(path.join(outputDir, convertedFile));
          } else {
            reject(new Error('文件转换失败：未找到输出文件'));
          }
        }
      }, 2000); // 等待2秒
    });
  });
}

// PDF转Word方法
async function convertToWord(req, res) {
  let tempDir = null;
  let outputFile = null;
  
  try {
    console.log('开始转换PDF到Word...');
    
    if (!req.file) {
      return res.status(400).json({
        success: false,
        message: '未接收到文件'
      });
    }

    // 检查文件大小
    const stats = fs.statSync(req.file.path);
    if (stats.size > 50 * 1024 * 1024) { // 50MB
      return res.status(400).json({
        success: false,
        message: '文件太大，请上传小于50MB的文件'
      });
    }

    // 检查 LibreOffice 是否存在
    if (!fs.existsSync(LIBRE_OFFICE_PATH)) {
      console.error('LibreOffice 路径不存在:', LIBRE_OFFICE_PATH);
      return res.status(500).json({
        success: false,
        message: '服务器未正确配置 LibreOffice'
      });
    }

    // 创建临时目录
    tempDir = path.join(os.tmpdir(), `convert_${Date.now()}`);
    fs.mkdirSync(tempDir, { recursive: true });

    // 确保输出目录存在
    const convertedDir = path.join(__dirname, '../../converted');
    if (!fs.existsSync(convertedDir)) {
      fs.mkdirSync(convertedDir, { recursive: true });
    }

    // 使用时间戳和随机数生成唯一的文件名
    const timestamp = Date.now();
    const randomStr = Math.random().toString(36).substring(7);
    const tempInputPath = path.join(tempDir, `input_${timestamp}_${randomStr}.pdf`);

    // 复制上传文件到临时目录
    fs.copyFileSync(req.file.path, tempInputPath);
    console.log('临时文件已创建:', tempInputPath);

    try {
      // 转换文件
      outputFile = await convertFileWithSoffice(tempInputPath, convertedDir, 'docx');
      console.log('文档转换完成，输出文件:', outputFile);

      if (!fs.existsSync(outputFile)) {
        throw new Error('输出文件未生成');
      }

      const docxUrl = `/converted/${path.basename(outputFile)}`;
      console.log('转换成功，Word文档地址:', docxUrl);

      res.json({
        success: true,
        message: '转换成功',
        pdfUrl: docxUrl
      });
    } catch (error) {
      console.error('文档转换失败:', error);
      res.status(500).json({
        success: false,
        message: '文档转换失败，可能是文件格式不兼容或文件已损坏'
      });
    }
  } catch (error) {
    console.error('转换过程出错:', error);
    res.status(500).json({
      success: false,
      message: '转换失败，请确保文件完整且格式正确'
    });
  } finally {
    // 清理临时文件
    try {
      if (req.file && req.file.path) {
        fs.unlinkSync(req.file.path);
      }
      if (tempDir && fs.existsSync(tempDir)) {
        fs.rmSync(tempDir, { recursive: true, force: true });
      }
    } catch (error) {
      console.error('清理临时文件失败:', error);
    }
  }
}

// Word转PDF方法
async function convertToPDF(req, res) {
  let tempDir = null;
  let outputFile = null;

  try {
    console.log('开始转换Word到PDF...');
    
    if (!req.file) {
      return res.status(400).json({
        success: false,
        message: '未接收到文件'
      });
    }

    // 检查 LibreOffice 是否存在
    if (!fs.existsSync(LIBRE_OFFICE_PATH)) {
      console.error('LibreOffice 路径不存在:', LIBRE_OFFICE_PATH);
      return res.status(500).json({
        success: false,
        message: '服务器未正确配置 LibreOffice'
      });
    }

    // 创建临时目录
    tempDir = path.join(os.tmpdir(), `convert_${Date.now()}`);
    fs.mkdirSync(tempDir, { recursive: true });

    // 确保输出目录存在
    const convertedDir = path.join(__dirname, '../../converted');
    if (!fs.existsSync(convertedDir)) {
      fs.mkdirSync(convertedDir, { recursive: true });
    }

    const ext = path.extname(req.file.originalname);
    const tempInputPath = path.join(tempDir, `input${ext}`);

    // 复制上传文件到临时目录
    fs.copyFileSync(req.file.path, tempInputPath);
    console.log('临时文件已创建:', tempInputPath);

    try {
      // 转换文件
      outputFile = await convertFileWithSoffice(tempInputPath, convertedDir, 'pdf');
      console.log('文档转换完成，输出文件:', outputFile);

      // 获取文件名
      const pdfFileName = path.basename(outputFile);
      const pdfUrl = `/converted/${pdfFileName}`;
      console.log('转换成功，PDF地址:', pdfUrl);

      res.json({
        success: true,
        message: '转换成功',
        pdfUrl: pdfUrl
      });
    } catch (error) {
      console.error('文档转换失败:', error);
      res.status(500).json({
        success: false,
        message: '文档转换失败，可能是文件格式不兼容或文件已损坏'
      });
    }

  } catch (error) {
    console.error('转换过程出错:', error);
    res.status(500).json({
      success: false,
      message: '转换失败，请确保文件完整且格式正确'
    });
  } finally {
    // 清理临时文件
    try {
      if (req.file && req.file.path) {
        fs.unlinkSync(req.file.path);
      }
      if (tempDir && fs.existsSync(tempDir)) {
        fs.rmSync(tempDir, { recursive: true, force: true });
      }
    } catch (error) {
      console.error('清理临时文件失败:', error);
    }
  }
}

module.exports = {
  convertToPDF,
  convertToWord
}; 